use crate::List::{Cons, Nill};
fn main() {
    // 15.1内容
    let s = Box::new(5);
    println!("s is {}", s); // 这个s是智能指针, 会在离开作用域的时候自动释放内存, 它存储在栈上, 但指向堆上的数据

    // 使用15.1
    let list = Cons(1, 
        Box::new(Cons(2, 
            Box::new(Cons(3, 
                Box::new(Nill)
            )))));
}

/*
 * 智能指针和引用, 智能指针实现了deref 和 drop这俩trait, 而引用则没有
 * box, 是一种最简单的智能指针, 一般在:
 * 1. 暂时不知道大小, 但上下文需要知道其确切大小
 * 2. 大量数据移交所有权, 但需要确保不被复制
 * 3. 使用某个值的时候, 只关心其是否实现了某个trait, 而无需关心它的类型
 * 说实话, 不理解. todo 
 */

//  15.1
// 假如我们有一个枚举类型
// 直接这样写是会报错的, 因为List类型是递归的, 但它的大小是未知的
// enum List {
//     Cons(i32, List),
//     Nil,
// }

// 所以需要将其改造, 引入Box
enum List {
    Cons(i32, Box<List>),
    Nill,
}
// Box适合于间接存储的场景, 例如以上的List递归数据